space_object:before_replace()
-
object
space_object
¶ -
space_object:
before_replace
([trigger-function[, old-trigger-function]])¶ Создание «триггера замены». Функция-триггер
trigger-function
будет выполняться в случае операцииreplace()
илиinsert()
, илиupdate()
, илиupsert()
, илиdelete()
над кортежем в спейсе<space-name>
.Параметры: - trigger-function (
function
) – функция, которая станет функцией-триггером; описание необязательных параметров для функций-триггеров см. в on_replace. - old-trigger-function (
function
) – существующая функция-триггер, которую заменитtrigger-function
возвращает: nil или указатель функции
Если указаны параметры
(nil, old-trigger-function)
, старый триггер будет удален.Если не указан ни один параметр, ответом будет список существующих функций-триггеров.
Следует знать, что если активация триггера произошла в случае репликации или определенного вида подключения, функция может ссылаться на box.session.type().
Подробная информация о характеристиках триггера находится в разделе Триггеры.
См. также space_object:on_replace().
Администраторы могут создавать триггеры замены с условием после замены
on_replace()
или до заменыbefore_replace()
. Если созданы оба типа, то все триггеры до заменыbefore_replace
выполняются до всех триггеров после заменыon_replace
. Функции для обоих типов триггеровon_replace
иbefore_replace
могут вносить изменения в базу данных, но только функции с триггерами до заменыbefore_replace
могут изменять кортеж, который будет заменен.Поскольку функция-триггер до замены
before_replace
может вносить дополнительные изменения в старый кортеж, для нее также потребуются дополнительные ресурсы для вызова старого кортежа до внесения изменений. Таким образом, лучше использовать триггер после заменыon_replace
, если нет необходимости изменять старый кортеж. Тем не менее, это применимо только к движку memtx – что касается движка vinyl, такой вызов произойдет для любого типа триггера. (В memtx’е данные кортежа хранятся вместе с ключом индекса, поэтому нет необходимости в дополнительном поиске; для vinyl’а дело обстоит иначе, поэтому нужен дополнительный поиск.)Если нет необходимости в дополнительных изменениях, следует использовать
on_replace
вместоbefore_replace
. Как правило,before_replace
используется только для определенных сценариев репликации – в части разрешения конфликтов.Что случится после возврата значения, которое может вернуть функция-триггер
before_replace
, зависит от этого значения. А именно:- если нет возвращаемого значения, выполнение продолжается со вставкой|заменой нового значения;
- если значение – nil, то кортеж будет удален;
- если значение совпадает со старым, то функция
on_replace
не вызывается, и изменение данных не происходит. Возвращаемого значения в таком случае не будет. - если значение совпадает с новым, то считаем, что вызова функции
before_replace
не было; - если значение другое, выполнение продолжается со вставкой/заменой нового значения.
Тем не менее, если функция-триггер возвращает старый кортеж или вызовет run_triggers(false), это не повлияет на другие триггеры, активируемые в том же запросе вставки, обновления или замены.
Пример:
Далее представлены функции
before_replace
: не возвращает значение, возвращает nil, возвращает совпадающее со старым значение, возвращает совпадающее с новым значение, возвращает другое значение.function f1 (old, new) return end function f2 (old, new) return nil end function f3 (old, new) return old end function f4 (old, new) return new end function f5 (old, new) return box.tuple.new({new[1],'b'}) end
- trigger-function (
-